System.Collections.Immutable void Main() { var input = File.ReadAllLines(Path.Combine(Path.GetDirectoryName(Util.CurrentQueryPath), "..", "day24.txt")) .Select(int.Parse) .ToList(); var part1 = GetPackageConfiguration(input, 3); part1.Dump(); var part2 = GetPackageConfiguration(input, 4); part2.Dump(); } public long CalculateQuantumeEntanglement(IEnumerable packages) => packages.Aggregate(1L, (x, y) => x * y); public long GetPackageConfiguration(List packages, int groups) { var groupWeight = packages.Sum() / groups; for (var packagesInGroup = 0; packagesInGroup < packages.Count; packagesInGroup++) { var possibleGroups = FindPackageGroups(packages, packagesInGroup, groupWeight); if (possibleGroups.Any()) return possibleGroups.Min(CalculateQuantumeEntanglement); } return default; } public IEnumerable> FindPackageGroups(List packages, int packagesToInclude, int remainingWeight) { if (remainingWeight == 0) { yield return ImmutableList.Create(); yield break; } if (packagesToInclude < 0 || remainingWeight < 0 || packages.Count == 0) yield break; if (packages[0] <= remainingWeight) foreach (var group in FindPackageGroups(packages.Skip(1).ToList(), packagesToInclude - 1, remainingWeight - packages[0])) { yield return group.Add(packages[0]); } foreach (var group in FindPackageGroups(packages.Skip(1).ToList(), packagesToInclude, remainingWeight)) { yield return group; } }